home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Frameworks / Extension Shell 1.4 / Extension Shell 1.4 (Source) / ShowIcon.c < prev    next >
Text File  |  1995-11-01  |  8KB  |  327 lines

  1. /*    NAME:
  2.         ShowIcon.c
  3.  
  4.     WRITTEN BY:
  5.         Dair Grant, based on Peter Lewis/Jim Walker/François Pottier/previous
  6.         ShowINIT authors' work.
  7.                 
  8.     DESCRIPTION:
  9.         This code is based on various bits of icon drawing code, and
  10.         adapted to support animated icons.
  11.  
  12.     NOTES:
  13.         We use the System 7 IconSuite calls to display the appropriate icon
  14.         from our INIT code's icon family. This looks after bit depths, and
  15.         removes the need for 'cicn's for colour displays.
  16.         
  17.         If we're not running under System 7, we can only handle 'ICN#'
  18.         resources.
  19.         
  20.     ___________________________________________________________________________
  21. */
  22. //=============================================================================
  23. //        Include files                                                                     
  24. //-----------------------------------------------------------------------------
  25. #include <Icons.h>
  26. #include "ES.h"
  27. #include "ShowIcon.h"
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43. //=============================================================================
  44. //        Private function prototypes                                                                     
  45. //-----------------------------------------------------------------------------
  46. unsigned short    CheckSum(unsigned short x);
  47. void            GetIconRect(Rect *theRect, Rect *thePortRect);
  48. void            NextPosition(Rect *theRect);
  49. void            PlotBWIcon(Rect *iconRect, Handle theIcon);
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65. //=============================================================================
  66. //        Private defines                                                                     
  67. //-----------------------------------------------------------------------------
  68. #define    LMVCoord            (* (short*) 0x92A)        // Vertical coordinate
  69. #define    LMVCheckSum            (* (short*) 0x928)        // Vertical coordinate checksum
  70. #define    LMHCoord            (* (short*) 0x92C)        // Horizontal coordinate
  71. #define    LMHCheckSum            (* (short*) 0x92E)        // Horizontal coordinate checksum
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87. //=============================================================================
  88. //        PlotINITIcon : Plot a series of icons on the screen.                                                                 
  89. //-----------------------------------------------------------------------------
  90. //        Note :    We are passed an array of icon resource IDs, the number of
  91. //                valid IDs there are in the array, the number of ticks to wait
  92. //                between showing each icon, and a status flag for the presence
  93. //                of System 7.
  94. //
  95. //                Usually Extensions will pass in only one icon, but this allows
  96. //                us to support animated icons as well.
  97. //
  98. //                We use System 7's IconSuite routines to plot the icons. These
  99. //                look after all the details of deciding what icon to use,
  100. //                depending on the depth of the display. They also work using
  101. //                the same icon families that the Finder uses, which means
  102. //                there's no need for a 'cicn' version.
  103. //
  104. //                If we don't have System 7, we don't have access to the
  105. //                IconSuite routines, and so have to resort to plotting 'ICN#'
  106. //                resources.
  107. //-----------------------------------------------------------------------------
  108. void PlotINITIcon(Boolean haveSys7, short animDelay, short numIcons, short (*theIcons)[])
  109. {    CGrafPtr    oldPort;
  110.     CGrafPort    newPort;
  111.     Handle        theIconHnds[kMaxNumIcons+1];
  112.     Rect         theIconPos;
  113.     long        theTicks;
  114.     short        i;
  115.  
  116.  
  117.  
  118.     // Save the port, and open a new one
  119.     GetPort((GrafPtr *) &oldPort);
  120.     OpenCPort(&newPort);
  121.     SetPort((GrafPort *) &newPort);
  122.  
  123.  
  124.     // Work out where we should draw the icon
  125.     GetIconRect(&theIconPos, &newPort.portRect);
  126.  
  127.  
  128.     // Read in handles to as many icons as we have to/can. If we Get/Plot/Dispose
  129.     // of each icon in turn, we can get jerky animation.
  130.     for (i = 1; i <= numIcons && i <= kMaxNumIcons; i++)
  131.         {
  132.         if (haveSys7)
  133.             GetIconSuite(&theIconHnds[i], (*theIcons)[i], svAllLargeData);
  134.         else
  135.             theIconHnds[i] = GetResource('ICN#', (*theIcons)[i]);
  136.         }
  137.             
  138.  
  139.     // Plot all the icons, with the right delay
  140.     for (i = 1; i <= numIcons && i <= kMaxNumIcons; i++)
  141.         {
  142.         if (haveSys7)
  143.             PlotIconSuite(&theIconPos, atNone, ttNone, theIconHnds[i]);
  144.         else
  145.             PlotBWIcon(&theIconPos, theIconHnds[i]);
  146.         Delay(animDelay, &theTicks);
  147.         }
  148.     
  149.     
  150.     // Before releasing them again
  151.     for (i = 1; i <= numIcons && i <= kMaxNumIcons; i++)
  152.         {
  153.         if (haveSys7)
  154.             DisposeIconSuite(theIconHnds[i], true);
  155.         else
  156.             ReleaseResource(theIconHnds[i]);
  157.         }
  158.  
  159.     
  160.     // Set things up for the next INIT's icon - if we drew anything
  161.     if (numIcons > 0)
  162.         NextPosition(&theIconPos);
  163.  
  164.  
  165.     // Dispose of our temporary port, and restore the old one
  166.     CloseCPort(&newPort);
  167.     SetPort((GrafPtr) oldPort);
  168. }
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184. //=============================================================================
  185. //        CheckSum : Verify that the previous INIT knew about ShowINIT Icon.
  186. //-----------------------------------------------------------------------------
  187. unsigned short CheckSum(unsigned short x)
  188. {
  189.     return((x << 1) | (x >> 15)) ^ 0x1021;
  190. }
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206. //=============================================================================
  207. //        GetIconRect : Calculate the correct position for our INIT's icon.                                                                 
  208. //-----------------------------------------------------------------------------
  209. //        Note :    We leave the correct position in theRect. We are given the
  210. //                portRect field of the current graphics port in thePortRect.
  211. //
  212. //                *theRect is forced to be onscreen. This is done by taking
  213. //                the horizontal offset modulo the screen width to generate the
  214. //                horizontal position of the icon, and the offset divided by the
  215. //                screen width to generate the proper row. This mechanism can get
  216. //                messed up if people plot icons at non-standard offsets.
  217. //
  218. //                We are also responsible for initialising the ShowInitIcon
  219. //                mechanism if we're the first INIT to load.
  220. //-----------------------------------------------------------------------------
  221. void GetIconRect(Rect *theRect, Rect *thePortRect)
  222. {
  223.  
  224.     // If we're first, initialise the mechanism for everyone else
  225.     if (CheckSum(LMHCoord) != LMHCheckSum)
  226.         LMHCoord = 8;
  227.     if (CheckSum(LMVCoord) != LMVCheckSum)
  228.         LMVCoord = thePortRect->bottom - 40;
  229.     
  230.     
  231.     
  232.     // Wrap round if we would move off the edge of the screen
  233.     if (LMHCoord + 34 > thePortRect->right)
  234.         {
  235.         theRect->left    = 8;
  236.         theRect->top    = LMVCoord - 40;
  237.         }
  238.  
  239.     // Otherwise move ourselves to the next position
  240.     else
  241.         {
  242.         theRect->left    = LMHCoord;
  243.         theRect->top    = LMVCoord;
  244.         }
  245.     theRect->right    = theRect->left + 32;
  246.     theRect->bottom    = theRect->top + 32;
  247. }
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263. //=============================================================================
  264. //        NextPosition : Advance the ShowIcon position for the next INIT.                                                                 
  265. //-----------------------------------------------------------------------------
  266. void NextPosition(Rect *theRect)
  267. {
  268.  
  269.     // Update the position for the next INIT
  270.     LMHCoord    = theRect->left + 40;
  271.     LMVCoord    = theRect->top;
  272.     LMHCheckSum    = CheckSum(LMHCoord);
  273.     LMVCheckSum    = CheckSum(LMVCoord);
  274. }
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290. //=============================================================================
  291. //        PlotBWIcon : Plot an 'ICN#' icon.                                                                 
  292. //-----------------------------------------------------------------------------
  293. void PlotBWIcon(Rect *iconRect, Handle theIcon)
  294. {    BitMap        src;
  295.     GrafPtr        thePort;
  296.     
  297.     
  298.  
  299.     // Lock the icon down, if we have one
  300.     if (theIcon == nil)
  301.         return;
  302.     else
  303.         HLock(theIcon);
  304.  
  305.     
  306.     
  307.     // Prepare the source and destination bitmaps.
  308.     src.baseAddr = *theIcon + 128;                            // Offset to Mask.
  309.     src.rowBytes = 4;
  310.     SetRect(&src.bounds, 0, 0, 32, 32);
  311.     GetPort(&thePort);
  312.     
  313.     
  314.     // Transfer the mask.
  315.     CopyBits(&src, &thePort->portBits, &src.bounds, iconRect, srcBic, nil);
  316.     
  317.         
  318.     // Followed by the icon.
  319.     src.baseAddr = *theIcon;                                /// 0 offset to icon data.
  320.     CopyBits(&src, &thePort->portBits, &src.bounds, iconRect, srcOr, nil);
  321.  
  322.  
  323.     // Unlock the icon.
  324.     HUnlock(theIcon);
  325. }
  326.  
  327.